1. Field of the Invention
The present invention relates to a data processing apparatus and method for converting a number between fixed-point and floating-point representations.
2. Description of the Prior Art
General purpose processors are known which can perform computation on two basic formats of data, namely integer data and floating-point data. The general purpose processor will typically include an integer hardware processing unit for processing integer numbers and a floating-point hardware processing unit for processing floating-point numbers.
In association with such general purpose processors, hardware techniques are known for converting integer numbers into floating-point numbers, and floating-point numbers into integer numbers, to allow transfer of data between the integer processing logic and the floating-point processing logic. Two examples of such conversion techniques are described in U.S. Pat. Nos. 3,961,170 and 4,631,696. Although both of these patents refer to conversion from “fixed-point” numbers to floating-point numbers, it should be noted that the fixed-point numbers they are describing in those patents are integers, i.e. the decimal point position is immediately to the right of the least significant bit.
In the more general sense, a fixed-point representation of a number is one in which the location of the decimal point within the n-bit number is programmable, and accordingly an integer number can be viewed as merely one specific example of a fixed-point representation, namely an example where the decimal point is located immediately to the right of the least significant bit. Hence, an unsigned fixed-point representation U(a,b) is one where the total number of bits n is equal to a+b, where a bits are to the left of the decimal point and b bits are to the right of the decimal point. Similarly, a signed fixed-point representation S (a,b) is one in which the total number of bits n is equal to a+b+1, where one bit is used to represent the sign bit. Again, there will be a bits to the left of the decimal point and b bits to the right of the decimal point.
Some examples of the U(a,b) and S(a,b) formats are as follows:
S(15,0)—the signed 16-bit integer format sometimes known as an int on a PDP-11 system, with a range of −32768 to +32767.
S(31,0)—the signed 32-bit integer format known as a “signed word” on ARM processors implementing architecture version 4 and above, with a range of −2,147,483,648 to +2,147,483,647. Likewise U(32,0) is known as a “unsigned word” on ARM processors, with a range of 0 to +4,294,967,296. In all these cases, the least significant bit represents the quantity 1. It is then said that this data type has a resolution of 1 or 20.
Examples of fixed-point data types for which the b term is non-zero are as follows:
U(8,8)—has 8 bits to the right of the decimal point, making up a fractional portion in which the least significant bit represents the quantity 2−8, or 0.00390625. The range is simply 0 to 256, with a resolution of 2−8.
In a similar manner, a S(13,2) number has a range of −8192 to +8191.75, with a resolution of 2−2 or 0.25.
In the embedded processor environment, where cost and size are paramount considerations, it has up to now been considered appropriate only to provide the embedded processor with an integer hardware processing unit and no floating-point hardware processing unit. Fixed-point algorithms have then been developed that enable data to possess a range outside of that available to integer numbers (for example a range less than one). Whilst within the programming environment, the fixed-point representations are understood, the integer hardware processing logic within the embedded processor will always treat the operands as integers, and hence will not process fixed-point numbers other than integer numbers properly for all operations. As a result, additional operations are required to ensure correct handling of fixed-point representations of numbers within the integer processing logic of the processor.
As an example of such an additional operation, a multiplication operation may be required. When two fixed-point values of type U(a1,b1) and U(a2,b2) are multiplied together, the resulting product is in U(a1+a2,b1+b2) form. To return it to either of the two formats requires the value to be scaled and either truncated or rounded. The scaling required is a multiplication by 2−x, where x is the fraction term (b1 or b2) of the format not selected, and the extraction of the n most-significant bits, where n is number of excess bits to the left of the decimal point and is (a1+a2) less the integer term (a1 or a2) of the unused format. It must be noted that all operations can overflow the destination format, as can the more common integer formats.